先前提到的的作法,都是預先配置記憶體空間後,才開始將資源放入。雖然簡單快速,但在決定預先配置空間尺寸,就變成一個需要進行評估的點。
那是不是有方法可以動態的生成空間,而非仰賴事先配置的記憶體空間?
有的。那就是資料結構中所提到的鍵結串列(Linked List)。鍵結串列又分單向與雙向兩種,而這兩種都可以被運用在 Queue 的概念之中。
我們將每一個資源,視為一個節點。
當放入新的資源時,會將該資源放入節點中,同時將原本 Rear 的節點與新節點鍵結,並移到 Rear 到最後的節點。

反之,當資源離開時,Front 會向後移動一個節點,其他節點與 Rear 維持不動。

不管是單向鍵結或雙向鍵結,概念都是相同的。

下面的實作,採用單向鍵結的方式,來實作 Queue。
因為 .net core 之中,己經存有 LinkedList<T> ,所以取名為 LinkedListQueue<T>
 public class LinkedListQueue<T>
 {
     private class LinkedNode<T>
     {
         public T Data { set; get; }
         public LinkedNode<T> Next { set; get; }
     }
     private int _count = 0;
     private LinkedNode<T> _node = null;
     public void Enqueue(T data)
     {
         var node = new LinkedNode<T> {Data = data, Next = null};
         if (_node == null)
         {
             _node = node;
         }
         else
         {
             var ptr = _node;
             while (ptr.Next != null)
             {
                 ptr = ptr.Next;
             }
             ptr.Next = node;
         }
         _count++;
     }
     public bool IsEmpty => _count == 0;
     public T Dequeue()
     {
         if (_node == null)
             return default(T);
         var ptr = _node;
         _node = _node.Next;
         _count--;
         return ptr.Data;
     }
 }